package com.kehutong.api.service.impl;

import com.kehutong.api.service.AccessControlService;
import com.kehutong.common.Authutil.HttpUtils;
import com.kehutong.common.Authutil.RandomUtils;
import com.kehutong.common.Authutil.SHA1;
import com.kehutong.common.Authutil.SignUtils;
import org.apache.http.client.utils.DateUtils;
import org.coraframework.json.JSONArray;
import org.coraframework.json.JSONObject;
import org.coraframework.logger.Logger;
import org.coraframework.logger.LoggerFactory;
import org.coraframework.mvc.http.ReqMapping;
import org.coraframework.mvc.webservice.WebService;
import org.coraframework.util.Objects;
import org.coraframework.util.secret.MD5;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * TODO
 * 伊时利门禁服务类
 * @author zhouweipeng
 * @version 1.0
 * @date 2021/7/15 11:40
 */
@WebService("/kht-bin/ysl/service")
public class AccessControlYSLService implements AccessControlService {
    private Logger log= LoggerFactory.getLogger(AccessControlYSLService.class);

    @ReqMapping("/managerDoorInfo")
    public Object managerDoorInfo(JSONObject jsonObject) throws Exception {
        log.info("伊时利设备管理调用=======================开始");
        String ext=jsonObject.getString("ext");
        String method="door/managerDoorInfo.htm";
        JSONObject data=new JSONObject();
        int doorNo=jsonObject.getIntValue("doorNo");  //设备号范围(1-65535)
        String doorName=jsonObject.getString("doorName"); //设备名称
        String doorSeq=jsonObject.getString("doorSeq");  //设备序列号
        String doorType=jsonObject.getString("doorType"); //门禁设备类型（1普通门禁、2人脸门禁，设备类型为门禁才需要填）
        String areaId=jsonObject.getString("areaId"); //小区编号(设备类型为门禁、考勤才需要填)
        String opType=jsonObject.getString("opType");  //1增加、2更新、3删除、4查询
        int doorreader=2;  //读头数，1表示1门、2表示2门禁、4表示4门（设备类型为门禁才需要填）
        int inout=1;     //进出方向，1进、2出（设备类型为门禁、考勤时才需要填）
        int clocktype=2;  //设备类型，0考勤机，1考勤门禁机，2门禁机，3消费机，15水控机
        int commtype=4; //0.串口通讯，1.UDP/IP通讯，3.USB通讯，4.动态IP/端口
        data.put("optype",opType);
        data.put("doorno",doorNo);
        data.put("doorname",doorName);
        data.put("doortype",doorType);
        data.put("doorreader",doorreader);
        data.put("inout",inout);
        data.put("clocktype",clocktype);
        data.put("commtype",commtype);
        data.put("doorseq",doorSeq);
        data.put("areaid",areaId);
        log.info("伊时利设备管理调用参数======================="+data.toJSONString());
        return callInterfaceByParam(method, ext, data);
    }

    @ReqMapping("/timeGroup")
    public Object timeGroup(JSONObject jsonObject) throws Exception {
        String ext=jsonObject.getString("ext");
        String method="door/timeGroup.htm";
        String opType=jsonObject.getString("opType");  //1增加、2更新、3删除
        String areaId=jsonObject.getString("areaId"); //小区编号
        int doorNo=jsonObject.getIntValue("doorNo");  //设备号范围(1-65535)
        int timeNo=jsonObject.getIntValue("timeNo");//时间组序号(1-32)
        String timeName=jsonObject.getString("timeName") ;//时间组名称
        String week=jsonObject.getString("week"); //星期几有效，格式1111111对应位为0表示无效，1表示有效；左到右依次表示星期一、星期二…….星期天
        JSONObject data=new JSONObject();
        JSONArray timelist=new JSONArray();
        JSONObject time=new JSONObject();
        String timeId=getRocordId(); //记录在第三方系统中的id
        String beginTime=jsonObject.getString("beginTime"); //开始时间、格式20210701000000
        String endTime=jsonObject.getString("endTime");  //结束时间
        JSONObject group=new JSONObject();
        group.put("begin","00:00");
        group.put("end","23:59");
        JSONObject[]timesections ={group};
        time.put("timeid",timeId);  //主键，去重
        time.put("areaid",areaId);
        time.put("doorno",doorNo);
        time.put("timeno",timeNo);
        time.put("timename",timeName);
        time.put("BeginTime",beginTime);
        time.put("EndTime",endTime);
        time.put("week",week);
        time.put("timesections",timesections);
        timelist.add(time);
        data.put("timelist",timelist);
        data.put("optype",opType);
        return callInterfaceByParam(method, ext, data);
    }

    @ReqMapping("/grantRights")
    public Object grantRights(JSONObject jsonObject) throws Exception {
        String ext=jsonObject.getString("ext");
        String method="door/grantRights.htm";
        String opType=jsonObject.getString("opType"); //1增加、2更新、3删除
        String areaId=jsonObject.getString("areaId");
        String personId=jsonObject.getString("personId");  //人员唯一id
        String cardSeq=jsonObject.getString("cardSeq"); //门禁卡号
        String doorSeq=jsonObject.getString("doorSeq"); //序列号
        String dueTime=jsonObject.getString("dueTime");  //暂时写死这里、到期时间
        String grantId=getRocordId(); //记录在第三方系统中的id
        String doorreader="1100"; //可通行的读头号,默认两个读头1100
        String timenolist="1;1;;";  //可通行的时间组 分号分割与读头对应，逗号分割多个时间组
        JSONObject data=new JSONObject();
        data.put("optype",opType);
        data.put("grantid",grantId);
        data.put("areaid",areaId);
        data.put("personid",personId);
        data.put("cardseq",cardSeq);
        data.put("doorseq",doorSeq);
        data.put("doorreader",doorreader);
        data.put("timenolist",timenolist);
        data.put("duetime",dueTime);
        return callInterfaceByParam(method, ext, data);
    }

    @ReqMapping("/codeRights")
    public Object codeRights(JSONObject jsonObject) throws Exception {
        String ext=jsonObject.getString("ext");
        String method="door/codeRights.htm";
        String areaId=jsonObject.getString("areaId");
        String personId=jsonObject.getString("personId");  //人员唯一id
        String doorSeq=jsonObject.getString("doorSeq"); //序列号
        String dueTime=jsonObject.getString("dueTime");  //暂时写死这里、到期时间、格式20990801000000
        String doorreader="1100";  //读头，默认1100
        JSONObject data=new JSONObject();
        data.put("areaid",areaId);
        data.put("personid",personId);
        data.put("doorseq",doorSeq);
        data.put("doorreader",doorreader);
        data.put("duetime",dueTime);
        return callInterfaceByParam(method, ext, data);
    }

    @ReqMapping("/openDoor")
    public Object openDoor(JSONObject jsonObject) throws Exception {
        String ext=jsonObject.getString("ext");
        String method="door/openDoor.htm";
        String opType=jsonObject.getString("opType"); //1开门、2关门
        String areaId=jsonObject.getString("areaId");
        String personId=jsonObject.getString("personId");
        String doorSeq=jsonObject.getString("doorSeq");
        String dlayTime=jsonObject.getString("dlayTime");  //开门时长 秒为单位
        String readerNo="1";  // 通行读头号、门号 单门传1 双门传1或2
        JSONObject data=new JSONObject();
        data.put("optype",opType);
        data.put("areaid",areaId);
        data.put("personid",personId);
        data.put("doorseq",doorSeq);
        data.put("readerno",readerNo);
        data.put("dlaytime",dlayTime);
        return callInterfaceByParam(method, ext, data);
    }

    @ReqMapping("/passSeq")
    public Object passSeq(JSONObject jsonObject) throws Exception {
        String ext=jsonObject.getString("ext");
        String method="door/passSeq.htm";
        JSONObject data=new JSONObject();
        String optype=jsonObject.getString("optype"); //1开门、2关门
        String start_date=jsonObject.getString("start_date"); //格式 20210721;
        String end_date=jsonObject.getString("end_date"); //结束日期（建议日期跨度不超过一周）
        String areaid=jsonObject.getString("areaid");
        String doorseq=jsonObject.getString("doorseq");   //门禁设备出厂序列号，非必填
        int pageindex=jsonObject.getIntValue("pageindex"); //第x页，从第1页开始查询
        int pagesize=jsonObject.getIntValue("pagesize"); //<=页最大数，最多不超过每页50条；
        int sort=jsonObject.getIntValue("sort"); //按时间排序，1降序、2升序
        if(Objects.nonEmpty(doorseq)){
            data.put("doorseq",doorseq);
        }
        data.put("optype",optype);
        data.put("start_date",start_date);
        data.put("end_date",end_date);
        data.put("areaid",areaid);
        data.put("pageindex",pageindex);
        data.put("pagesize",pagesize);
        data.put("sort",sort);
        return callInterfaceByParam(method, ext, data);
    }

    @ReqMapping("/setHeartBeat")
    public Object setHeartBeat(JSONObject jsonObject) throws Exception {
        String ext=jsonObject.getString("ext");
        String method="device/setHeartBeat.htm";
        String url=jsonObject.getString("notifyUrl");
        JSONObject data=new JSONObject();
        data.put("url",url);
        return callInterfaceByParam(method, ext, data);
    }

    @ReqMapping("/setRecordCallBack")
    public Object setRecordCallBack(JSONObject jsonObject) throws Exception {
        String ext=jsonObject.getString("ext");
        String url=jsonObject.getString("notifyUrl");
        String method="device/setRecordCallBack.htm"; //处理接口
        JSONObject data=new JSONObject();
        data.put("url",url);
        return callInterfaceByParam(method, ext, data);
    }

    /**
     * 封装参数并请求
     * @param method 处理接口
     * @param ext 客户通在厂商的配置信息，接口url、版本号等
     * @param data 请求参数json
     * @return
     */
    private Object callInterfaceByParam(String method, String ext, JSONObject data) {
        Map<String,Object> param=new HashMap<String,Object>();
        JSONObject extJson=JSONObject.parseObject(ext);
        String request_url=extJson.getString("request_url")+method;
        int open_id=extJson.getIntValue("open_id");
        String open_key=extJson.getString("open_key");
        String version=extJson.getString("version");
        String timestamp= getTimestamp();
        param.put("open_id",open_id);
        param.put("timestamp",timestamp);
        param.put("version",version);
        param.put("data",data.toJSONString());
        param.put("open_key",open_key);
        String linkStr= SignUtils.linkString(param);
        String sign= MD5.MD5Encode(SHA1.encode(linkStr)).toUpperCase();
        param.remove("open_key");
        param.put("sign",sign);
        String result= HttpUtils.sendByForm(request_url,param);
        log.info("调用伊时利接口返回==========="+result);
        JSONObject resultJson=JSONObject.parseObject(result);
        return resultJson;
    }
    private String getRocordId(){
       return DateUtils.formatDate(new Date(),"yyyyMMddHHmmssSSS")+ RandomUtils.getRandomNumber(6);
    }
    private String getTimestamp(){
        return Long.toString(System.currentTimeMillis()/1000);
    }
}


